#include<iostream>
#include<unistd.h>
#include<pthread.h>
#include<time.h>
#include"BlockkingQueue.hpp"

void* Producer(void* args)
{
    ccc::BlockQueue<int>* bq = static_cast<ccc::BlockQueue<int>*>(args);
     while(true)
    {
        // 1.生产商品（通过某种渠道获取数据）
        int num = rand() % 10;

        // 2.将商品推送至阻塞队列中
        bq->Push(num);

        std::cout << "Producer 生产了一个数据: " << num << std::endl;
        std::cout << "------------------------" << std::endl;



    }

    pthread_exit((void*)0);

}

void* Consumer(void* args)
{
       ccc::BlockQueue<int>* bq = static_cast<ccc::BlockQueue<int>*>(args);

    while(true)
    {
        // 消费者每隔一秒进行一次消费
        sleep(1);

        // 1.从阻塞队列中获取商品
        int num;
        bq->Pop(&num);

        // 2.消费商品（结合某种具体业务进行处理）
        std::cout << "Consumer 消费了一个数据: " << num << std::endl;
        std::cout << "------------------------" << std::endl;
    }

    pthread_exit((void*)0);
}

int main()
{
    // 种子
    srand((size_t)time(nullptr));

    // 创建一个阻塞队列
    ccc::BlockQueue<int>* bq = new ccc::BlockQueue<int>;

    // 创建两个线程，生产者，消费者
    pthread_t pro,con;
    pthread_create(&pro,nullptr,Producer,bq);
    pthread_create(&con,nullptr,Consumer,bq);

    pthread_join(pro,nullptr);
    pthread_join(con,nullptr);

    delete bq;
    return 0;
}